package cn.tuling.example;

/**
 * 例子：用模板方法模式实现出国留学手续设计程序。
 * <p>
 * 分析：出国留学手续一般经过以下流程：
 * 1.索取学校资料
 * 2.提出入学申请
 * 3.办理因私出国护照、出境卡和公证
 * 4.申请签证
 * 5.体检、订机票、准备行装
 * 6.抵达目标学校
 * 其中有些业务对各个学校是一样的，但有些业务因学校不同而不同，所以比较适合用模板方法模式来实现。
 */
public class TemplateMethodTest {
    public static void main(String[] args) {
        StudyAbroad abroad = new StudyInAmerica();
        abroad.templateMethod();
    }

}

abstract class StudyAbroad {
    public void templateMethod() {
        lookingForSchool();
        applyForEnrol();
        applyForPassport();
        applyForVisa();
        readyGoAbroad();
        arriving();
    }

    abstract void lookingForSchool();

    abstract void applyForEnrol();

    void applyForPassport() {
        System.out.println("3.办理因私出国护照、出境卡和公证");
    }

    void applyForVisa() {
        System.out.println("4.申请签证");
    }

    void readyGoAbroad() {
        System.out.println("5.体检、订机票、准备行装");
    }

    abstract void arriving();
}

class StudyInAmerica extends StudyAbroad {

    @Override
    void lookingForSchool() {
        System.out.println("1.索取学校资料");
    }

    @Override
    void applyForEnrol() {
        System.out.println("2.提出入学申请");
    }

    @Override
    void arriving() {
        System.out.println("6.抵达目标学校");
    }
}
